﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Audio;

namespace NAVE_Alice_demo.Cena08.Cena.Objeto
{
    /// <summary>
    /// Classe que gerencia objetos
    /// </summary>
    abstract class Objeto
    {
        #region Variáveis

        /// <summary>
        /// Imagem do objeto
        /// </summary>
        protected Texture2D t2d_imagem;

        /// <summary>
        /// Vetores de posição e tamanho, respectivamente
        /// </summary>
        protected Vector2 v2d_posicao, v2d_tamanho;

        /// <summary>
        /// Total de frames da animação 
        /// </summary>
        protected ushort totalFrames;
        
        /// <summary>
        /// Frame atual
        /// </summary>
        public ushort frameAtual
        { protected get; set; }

        /// <summary>
        /// Lista de frames
        /// </summary>
        protected List<Rectangle> rec_frame = new List<Rectangle>();

        /// <summary>
        /// Tempo de jogo atual, tempo total para passar o frame, respectivamente
        /// </summary>
        protected int int_tempoAtual, int_tempoProximoFrame;

        /// <summary>
        /// Verifica se a animação acabou
        /// </summary>
        public bool bln_fimAnimacao
        { get; protected set; }

        /// <summary>
        /// Som de efeito
        /// </summary>
        protected SoundEffect snd_effect;

        #endregion

        #region Métodos
        //Verifica se objeto está sendo tocado pelo mouse
        public bool Tocado(MouseState mouse)
        {
            if (mouse.X >= v2d_posicao.X && mouse.X <= v2d_posicao.X + v2d_tamanho.X &&
                mouse.Y >= v2d_posicao.Y && mouse.Y <= v2d_posicao.Y + v2d_tamanho.Y)
                return true;

            return false;
        }

        //Mouse anterior
        private MouseState mouseAnterior;
        /// <summary>
        /// Verificar se o objeto foi clicado
        /// </summary>
        /// <param name="mouse">Verificar se o usuário clicou</param>
        /// <returns></returns>
        public bool Clicado(MouseState mouse)
        {
            if (Tocado(mouse) && 
                mouse.LeftButton == ButtonState.Pressed &&
                mouseAnterior.LeftButton == ButtonState.Released)
                    return true;

            mouseAnterior = mouse;
            return false;
        }

        /// <summary>
        /// Animando o objeto
        /// </summary>
        /// <param name="gameTime">Tempo de jogo real</param>
        public virtual void Anime(GameTime gameTime)
        {
            bln_fimAnimacao = false;
            int_tempoAtual += gameTime.ElapsedGameTime.Milliseconds;
            if (int_tempoAtual > int_tempoProximoFrame)
            {
                if (frameAtual < rec_frame.Count() - 1)
                    frameAtual++;
                else
                {
                    frameAtual = 0;
                    bln_fimAnimacao = true;
                }
                int_tempoAtual = 0;
            }
        }

        /// <summary>
        /// Atualizando a posição do objeto
        /// </summary>
        /// <param name="flt_velocidade">Velocidade do paralaxe</param>
        public void AtualizandoPosicao(float flt_velocidade)
        {
            v2d_posicao.X += flt_velocidade;
        }

        public void TocarEfeito()
        {
            if (snd_effect != null)
                snd_effect.Play();
        }

        /// <summary>
        /// Desenhe
        /// </summary>
        /// <param name="spriteBatch">Desenhar na tela de jogo</param>
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(t2d_imagem, new Rectangle((int)v2d_posicao.X, (int)v2d_posicao.Y, (int)v2d_tamanho.X, (int)v2d_tamanho.Y),
                             rec_frame[frameAtual], Color.White);
        }

        #endregion
    }
}
